from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db import DatabaseError
from django.http import HttpResponse, HttpResponseForbidden, JsonResponse
from django.shortcuts import render, redirect

# Create your views here.
from django.urls import reverse
from django.views import View
from users.models import User
from utils.response_code import RETCODE


def index(request):
    return HttpResponse("用户管理模块")



#类视图实现 用户的 post and get ---------------
class RegisterView(View):

    def get(self,request):
        #提供用户注册页面
        return render(request,'register.html')

    def post(self,request):
        # 1.接收请求参数
        username = request.POST.get('username')
        password = request.POST.get('password')
        password2 = request.POST.get('password2')
        mobile = request.POST.get('mobile')
        allow = request.POST.get("allow")  # 是否同意协议
        # 判断用户是否勾选协议
        if allow != 'on':
            return HttpResponseForbidden("请勾选用户协议")


        # 保存注册数据：是注册业务的核心
        #异常，在数据库中  desc db_user  可以看到用户名、密码、手机号都是唯一的（UNI），如果出现相同的 则抛出异常
        try:
        # 注册成功的用户对象
            user = User.objects.create_user(username=username, mobile=mobile,password=password, )
        except DatabaseError:
            return render(request, 'register.html', {'register_errmsg': '注册失败'})

        #注册成功后，将用户的登陆信息实现状态保持， 会保存注册用户的session信息   （下面还有一个登陆的  也要保存用户的session信息）
        login(request, user)

        # 响应登录结果:重定向到首页
        temp_url = reverse('contents:index')   #(广告 ： index)
        print(temp_url)
        response = redirect(temp_url)
        #redirect理解过来是这样用  redirect("https://www.baidu.com/")

        # 为了实现在首页右上角展示用户信息，我们需要将用户名缓存到cookie中
        response.set_cookie('username', user.username, max_age=3600 * 24 * 14)
        return response


class UsernameCountView(View):
    """判断用户名是否重复注册"""
    def get(self, request, username):
        # 如果为1 这说明用户已存在
        count = User.objects.filter(username=username).count()
        return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'count':count})


class MoblieCountView(View):
    def get(self, request, mobile):   #参数名 mobile 不能随意修改，取决于路由中正则表达式中的名字
        count = User.objects.filter(mobile=mobile).count()   #过滤查询
        return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', "count":count}) #返回Json为字典形式





#-----------------------------------------Django 中都提供了 login 与 logout 的函数操作
# （login()  实现状态保持，）
# （logout() 清除服务端的Session信息和客户端Cookie中的用户名）

class LoginView(View):

    def get(self,request):
        return render(request,'login.html')

    #接收浏览器客户端发过来的POST参数   request.POST.get(...) 取什么东西具体看前端代码中取的什么名字
    def post(self,request):
        # 接收参数
        username = request.POST.get('username')    #看看前端代码设置的参数名字是什么
        password = request.POST.get('password')
        remembered = request.POST.get('remembered')

        # 检验用户密码合法性
        # django框架 封装authenticate方法，  这个方法可以将查到的用户返回给变量， 如果没找到则为空
        user = authenticate(username=username, password=password)
        if user is None:
            #不合法，重新进入登陆界面
            return render(request, 'login.html', {'account_errmsg': '账号或密码错误'})

        login(request, user)  # 实现状态保持
        if remembered != 'on':
            request.session.set_expiry(0)  # 没有记住用户：浏览器会话结束就过期
        else:
            request.session.set_expiry(None)
        # 记住用户：None表示两周后过期，在settings.py中可以设置SESSION_COOKIE_AGE来配置全局的过期时间。默认是2周的时间

        next = request.GET.get('next')  # 先取出当前next
        if next:
            #next不为空，则重定向next 指向的url
            response = redirect(next)  # 重定向到next
        else:
            #为空，跳转到首页
            response = redirect(reverse('contents:index'))

        # 为了实现在首页右上角展示用户信息，我们需要将用户名缓存到cookie中
        response.set_cookie('username', user.username, max_age=3600 * 24 * 14)
        return response


class LogoutView(View):
    """用户退出登录"""
    def get(self, request):
        # 清除状态保持信息
        logout(request)
        # 响应结果 重定向到首页
        response = redirect(reverse('contents:index'))
        # 删除cookie中的用户名
        response.delete_cookie('username')
        return response


class UserInfoView(LoginRequiredMixin, View):
    """用户中心"""
    def get(self, request):
        """提供用户中心页面"""
        context = {
            'username': request.user.username,
            'mobile': request.user.mobile,
        }
        return render(request, 'user_center_info.html',context)
